home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / main.C < prev    next >
C/C++ Source or Header  |  2005-04-08  |  17KB  |  702 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   main.c  -  Main file of the synthesizer
  5.   Copyright (C) 2002-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #include <math.h>
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <time.h>
  27.  
  28. #include <unistd.h>
  29. #include <pthread.h>
  30.  
  31. #ifdef OS_LINUX
  32. #include <getopt.h>
  33. #elif OS_WINDOIWS
  34. #include <winbase.h>
  35. #include <windows.h>
  36. #endif
  37.  
  38. #include "Misc/Master.h"
  39. #include "Misc/Util.h"
  40. #include "Misc/Dump.h"
  41. extern Dump dump;
  42.  
  43. #ifdef ALSAMIDIIN
  44. #include "Input/ALSAMidiIn.h"
  45. #endif
  46.  
  47. #ifdef OSSMIDIIN
  48. #include "Input/OSSMidiIn.h"
  49. #endif
  50.  
  51. #if (defined(NONEMIDIIN)||defined(VSTMIDIIN))
  52. #include "Input/NULLMidiIn.h"
  53. #endif
  54.  
  55. #ifdef WINMIDIIN
  56. #include "Input/WINMidiIn.h"
  57. #endif
  58.  
  59.  
  60. #include "UI/MasterUI.h"
  61.  
  62. MasterUI *ui;
  63. pthread_t thr1,thr2,thr3,thr4;
  64. Master *master;
  65. int swaplr=0;//1 for left-right swapping
  66. bool usejackit=false;
  67.  
  68. #ifdef JACKAUDIOOUT
  69. #include "Output/JACKaudiooutput.h"
  70. #endif
  71.  
  72. #ifdef JACK_RTAUDIOOUT
  73. #include "Output/JACKaudiooutput.h"
  74. #endif
  75.  
  76. #ifdef PAAUDIOOUT
  77. #include "Output/PAaudiooutput.h"
  78. #endif
  79.  
  80. #ifdef OSSAUDIOOUT
  81. #include "Output/OSSaudiooutput.h"
  82. OSSaudiooutput *audioout;
  83. #endif
  84.  
  85. MidiIn *Midi;
  86. int Pexitprogram=0;//if the UI set this to 1, the program will exit
  87.  
  88. /*
  89.  * Try to get the realtime priority
  90.  */
  91. void set_realtime(){
  92. #ifdef OS_LINUX
  93.     sched_param sc;
  94.     
  95.     sc.sched_priority=50;
  96.  
  97.     //if you want get "sched_setscheduler undeclared" from compilation, you can safely remove the folowing line
  98.     sched_setscheduler(0,SCHED_FIFO,&sc);
  99. //    if (err==0) printf("Real-time");
  100. #endif
  101. };
  102.  
  103. /*
  104.  * Midi input thread
  105.  */
  106. #if !(defined(WINMIDIIN)||defined(VSTMIDIIN))
  107. void *thread1(void *arg){
  108.     MidiCmdType cmdtype;
  109.     unsigned char cmdchan,note,vel;
  110.     int cmdparams[MP_MAX_BYTES];
  111.  
  112.     set_realtime();
  113.     while (Pexitprogram==0){
  114.     Midi->getmidicmd(cmdtype,cmdchan,cmdparams);
  115.         note=cmdparams[0];
  116.     vel=cmdparams[1];
  117.     
  118.     pthread_mutex_lock(&master->mutex);
  119.  
  120.     if ((cmdtype==MidiNoteON)&&(note!=0)) master->NoteOn(cmdchan,note,vel);
  121.     if ((cmdtype==MidiNoteOFF)&&(note!=0)) master->NoteOff(cmdchan,note);
  122.     if (cmdtype==MidiController) master->SetController(cmdchan,cmdparams[0],cmdparams[1]);
  123.  
  124.     pthread_mutex_unlock(&master->mutex);
  125.     };
  126.     
  127.     return(0);
  128. };
  129. #endif
  130.  
  131. /*
  132.  * Wave output thread (for OSS AUDIO out)
  133.  */
  134. #if defined(OSSAUDIOOUT)
  135. //!(defined(JACKAUDIOOUT)||defined(JACK_RTAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT))
  136.  
  137. void *thread2(void *arg){
  138.     REALTYPE outputl[SOUND_BUFFER_SIZE];
  139.     REALTYPE outputr[SOUND_BUFFER_SIZE];
  140.  
  141.     set_realtime();
  142.     while (Pexitprogram==0){
  143.     pthread_mutex_lock(&master->mutex);
  144.     master->AudioOut(outputl,outputr);
  145.     pthread_mutex_unlock(&master->mutex);
  146.  
  147. #ifndef NONEAUDIOOUT
  148.     audioout->OSSout(outputl,outputr);
  149. #endif
  150.  
  151. /** /      int i,x,x2;
  152.     REALTYPE xx,xx2;
  153.  
  154.         short int xsmps[SOUND_BUFFER_SIZE*2];    
  155.     for (i=0;i<SOUND_BUFFER_SIZE;i++){//output to stdout
  156.         xx=-outputl[i]*32767;
  157.         xx2=-outputr[i]*32767;
  158.         if (xx<-32768) xx=-32768;
  159.         if (xx>32767) xx=32767;
  160.         if (xx2<-32768) xx2=-32768;
  161.         if (xx2>32767) xx2=32767;
  162.         x=(short int) xx;
  163.         x2=(short int) xx2;
  164.         xsmps[i*2]=x;xsmps[i*2+1]=x2;
  165.         };
  166.         write(1,&xsmps,SOUND_BUFFER_SIZE*2*2);
  167.         
  168.         / * */
  169.     }; 
  170.     return(0);
  171. };
  172. #endif
  173.  
  174. /*
  175.  * User Interface thread
  176.  */
  177.  
  178.  
  179. void *thread3(void *arg){
  180.     ui->showUI();
  181.     while (Pexitprogram==0) Fl::wait();
  182.     return(0);
  183. };
  184.  
  185. /*
  186.  * Sequencer thread (test)
  187.  */
  188. void *thread4(void *arg){
  189.     while (Pexitprogram==0){
  190.     int type,par1,par2,again,midichan;
  191.     for (int ntrack=0;ntrack<NUM_MIDI_TRACKS;ntrack++){
  192.         if (master->seq.play==0) break;
  193.         do{
  194.         again=master->seq.getevent(ntrack,&midichan,&type,&par1,&par2);
  195. //        printf("ntrack=%d again=%d\n",ntrack,again);
  196.         if (type>0) {
  197. //        printf("%d %d  %d %d %d\n",type,midichan,chan,par1,par2);
  198.  
  199. //    if (cmdtype==MidiController) master->SetController(cmdchan,cmdparams[0],cmdparams[1]);
  200.  
  201.     
  202.     
  203.             pthread_mutex_lock(&master->mutex);
  204.                 if (type==1){//note_on or note_off
  205.             if (par2!=0) master->NoteOn(midichan,par1,par2);
  206.                 else master->NoteOff(midichan,par1);
  207.                 };
  208.             pthread_mutex_unlock(&master->mutex);
  209.         };
  210.         } while (again>0);
  211.         
  212.     };
  213. //if (!realtime player) atunci fac asta
  214. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  215. #ifdef OS_LINUX
  216.     usleep(1000);
  217. #elif OS_WINDOWS
  218.     Sleep(1);
  219. #endif
  220.     };
  221.     
  222.     return(0);
  223. };
  224.  
  225. /*
  226.  * Program initialisation
  227.  */
  228.  
  229.  
  230. void initprogram(){
  231. #ifndef JACKAUDIOOUT
  232. #ifndef JACK_RTAUDIOOUT
  233.     fprintf(stderr,"\nSample Rate = \t\t%d\n",SAMPLE_RATE);
  234. #endif
  235. #endif
  236.     fprintf(stderr,"Sound Buffer Size = \t%d samples\n",SOUND_BUFFER_SIZE);
  237.     fprintf(stderr,"Internal latency = \t%.1f ms\n",SOUND_BUFFER_SIZE*1000.0/SAMPLE_RATE);
  238.     fprintf(stderr,"ADsynth Oscil.Size = \t%d samples\n",OSCIL_SIZE);
  239.  
  240.     fflush(stderr);
  241.     srand(time(NULL));
  242.     denormalkillbuf=new REALTYPE [SOUND_BUFFER_SIZE];
  243.     for (int i=0;i<SOUND_BUFFER_SIZE;i++) denormalkillbuf[i]=(RND-0.5)*1e-16;
  244.     
  245.     OscilGen::tmpsmps=new REALTYPE[OSCIL_SIZE];
  246.     newFFTFREQS(&OscilGen::outoscilFFTfreqs,OSCIL_SIZE/2);
  247.     
  248.     master=new Master();
  249.     master->swaplr=swaplr;
  250.  
  251. #if defined(JACKAUDIOOUT)
  252.     if (usejackit) {
  253.     bool tmp=JACKaudiooutputinit(master);
  254. #if defined(OSSAUDIOOUT)
  255.     if (!tmp) printf("\nUsing OSS instead.\n");
  256. #else
  257.     if (!tmp) exit(1);
  258. #endif
  259.     usejackit=tmp;
  260.     };
  261. #endif
  262. #if defined(OSSAUDIOOUT)
  263.     if (!usejackit) audioout=new OSSaudiooutput();
  264.     else audioout=NULL;
  265. #endif
  266.  
  267. #ifdef JACK_RTAUDIOOUT
  268.     JACKaudiooutputinit(master);
  269. #endif
  270. #ifdef PAAUDIOOUT
  271.     PAaudiooutputinit(master);
  272. #endif 
  273.  
  274. #ifdef ALSAMIDIIN
  275.     Midi=new ALSAMidiIn();
  276. #endif
  277. #ifdef OSSMIDIIN
  278.     Midi=new OSSMidiIn();
  279. #endif
  280. #if (defined(NONEMIDIIN)||(defined(VSTMIDIIN)))
  281.     Midi=new NULLMidiIn();
  282. #endif
  283.     ui=new MasterUI(master,&Pexitprogram);
  284. };
  285.  
  286. /*
  287.  * Program exit
  288.  */
  289. void exitprogram(){
  290.     pthread_mutex_lock(&master->mutex);
  291. #ifdef OSSAUDIOOUT
  292.     delete(audioout);
  293. #endif
  294. #ifdef JACKAUDIOOUT
  295.     if (usejackit) JACKfinish();
  296. #endif
  297. #ifdef JACK_RTAUDIOOUT
  298.     JACKfinish();
  299. #endif
  300. #ifdef PAAUDIOOUT
  301.     PAfinish();
  302. #endif
  303.  
  304.     delete(ui);
  305.     delete(Midi);
  306.     delete(master); 
  307.  
  308. //    pthread_mutex_unlock(&master->mutex);
  309.     delete(denormalkillbuf);
  310.     delete(OscilGen::tmpsmps);
  311.     deleteFFTFREQS(&OscilGen::outoscilFFTfreqs);
  312.  
  313. };
  314.  
  315. #ifdef OS_WINDOWS
  316. #define ARGSIZE 100
  317.  char winoptarguments[ARGSIZE];
  318.  char getopt(int argc, char *argv[], const char *shortopts, int *index){
  319.     winoptarguments[0]=0;
  320.     char result=0;
  321.     
  322.     if (*index>=argc) return(-1);
  323.     
  324.     if (strlen(argv[*index])==2) 
  325.     if (argv[*index][0]=='-') {
  326.         result=argv[*index][1];
  327.         if (*index+1<argc) {
  328.         snprintf(winoptarguments,ARGSIZE,"%s",argv[*index+1]);
  329.         };
  330.     };
  331.     (*index)++;
  332.     return(result);
  333.  };
  334.  int opterr=0;
  335. #undef ARGSIZE
  336.  
  337. #endif
  338.  
  339. #ifndef VSTAUDIOOUT
  340. int main(int argc, char *argv[]){
  341.     config.init();
  342.     int noui=0;
  343. #ifdef JACKAUDIOOUT
  344.     usejackit=true;//use jack by default
  345. #endif
  346.     fprintf(stderr,"%s","\nZynAddSubFX - Copyright (c) 2002-2005 Nasca Octavian Paul\n");
  347.     fprintf(stderr,"Compiled: %s %s\n",__DATE__,__TIME__);
  348.     fprintf(stderr,"%s","This program is free software (GNU GPL v.2) and \n    it comes with ABSOLUTELY NO WARRANTY.\n\n");
  349. #ifdef OS_LINUX
  350.     if (argc==1) fprintf(stderr,"%s","Try 'zynaddsubfx --help' for command-line options.\n");
  351. #else
  352.     if (argc==1) fprintf(stderr,"%s","Try 'zynaddsubfx -h' for command-line options.\n");
  353. #endif
  354.     /* Get the settings from the Config*/
  355.     SAMPLE_RATE=config.cfg.SampleRate;    
  356.     SOUND_BUFFER_SIZE=config.cfg.SoundBufferSize;
  357.     OSCIL_SIZE=config.cfg.OscilSize;
  358.     swaplr=config.cfg.SwapStereo;
  359.     
  360.     /* Parse command-line options */
  361. #ifdef OS_LINUX
  362.     struct option opts[]={
  363.     {"load",2,NULL,'l'},
  364.     {"sample-rate",2,NULL,'r'},
  365.     {"buffer-size",2,NULL,'b'},
  366.     {"oscil-size",2,NULL,'o'},
  367.     {"dump",2,NULL,'D'},
  368.     {"swap",2,NULL,'S'},
  369.     {"no-gui",2,NULL,'U'},
  370.     {"not-use-jack",2,NULL,'A'},
  371.     {"dummy",2,NULL,'Y'},
  372.     {"help",2,NULL,'h'},
  373.     {0,0,0,0}
  374.     };
  375. #endif
  376.     opterr=0;
  377.     int option_index=0,opt,exitwithhelp=0;
  378.     
  379.     char loadfile[1001];ZERO(loadfile,1001);
  380.     
  381.     while (1){
  382. #ifdef OS_LINUX
  383.     opt=getopt_long(argc,argv,"l:r:b:o:hSDUAY",opts,&option_index);
  384.     char *optarguments=optarg;
  385. #else
  386.     opt=getopt(argc,argv,"l:r:b:o:hSDUAY",&option_index);
  387.     char *optarguments=&winoptarguments[0];
  388. #endif 
  389.  
  390.     if (opt==-1) break;
  391.  
  392.     int tmp;
  393.     switch(opt){
  394.         case 'h':exitwithhelp=1;
  395.              break;
  396.         case 'Y':/* this command a dummy command (has NO effect) 
  397.                 and is used because I need for NSIS installer 
  398.             (NSIS sometimes forces a command line for a 
  399.             program, even if I don't need that; eg. when 
  400.             I want to add a icon to a shortcut.
  401.               */
  402.              break;
  403.         case 'U':noui=1;
  404.              break;
  405.         case 'A':
  406. #ifdef JACKAUDIOOUT
  407. #ifdef OSSAUDIOOUT
  408.              usejackit=false;
  409. #endif
  410. #endif
  411.              break;
  412.         case 'l':tmp=0;
  413.                  if (optarguments!=NULL) {
  414.                 snprintf(loadfile,1000,"%s",optarguments);
  415.              };
  416.              break;
  417.         case 'r':tmp=0;
  418.                  if (optarguments!=NULL) tmp=atoi(optarguments);
  419.              if (tmp>=4000) {
  420.                 SAMPLE_RATE=tmp;
  421.              } else {
  422.                 fprintf(stderr,"ERROR:Incorrect sample rate  %s .\n",optarguments);
  423.             exit(1);
  424.              };
  425.              break;
  426.         case 'b':tmp=0;
  427.                  if (optarguments!=NULL) tmp=atoi(optarguments);
  428.              if (tmp>=2) {
  429.                 SOUND_BUFFER_SIZE=tmp;
  430.              } else {
  431.                 fprintf(stderr,"ERROR:Incorrect buffer size  %s .\n",optarguments);
  432.             exit(1);
  433.              };
  434.              break;
  435.         case 'o':tmp=0;
  436.                  if (optarguments!=NULL) tmp=atoi(optarguments);
  437.              OSCIL_SIZE=tmp;
  438.                 if (OSCIL_SIZE<MAX_AD_HARMONICS*2) OSCIL_SIZE=MAX_AD_HARMONICS*2;
  439.              OSCIL_SIZE=(int) pow(2,ceil(log (OSCIL_SIZE-1.0)/log(2.0)));
  440.              if (tmp!=OSCIL_SIZE) fprintf(stderr,"\nOSCIL_SIZE is wrong (must me 2^n) or too small. Adjusting to %d.\n",OSCIL_SIZE);
  441.              break;
  442.         case 'S':swaplr=1;
  443.              break;
  444.         case 'D':dump.startnow();
  445.              break;
  446.         case '?':fprintf(stderr,"%s","ERROR:Bad option or parameter.\n\n");
  447.                  exitwithhelp=1;
  448.              break;
  449.     };
  450.     };
  451.     
  452.     if (exitwithhelp!=0) {
  453.     fprintf(stderr,"%s","Usage: zynaddsubfx [OPTION]\n\n");
  454.     fprintf(stderr,"%s","  -h , --help \t\t\t\t display command-line help and exit\n");
  455.     fprintf(stderr,"%s","  -l file, --load=FILE\t\t\t loads a .xmz file\n");
  456.     fprintf(stderr,"%s","  -r SR, --sample-rate=SR\t\t set the sample rate SR\n");
  457.     fprintf(stderr,"%s","  -b BS, --buffer-size=SR\t\t set the buffer size (granularity)\n");
  458.     fprintf(stderr,"%s","  -o OS, --oscil-size=OS\t\t set the ADsynth oscil. size\n");
  459.     fprintf(stderr,"%s","  -S , --swap\t\t\t\t swap Left <--> Right\n");
  460.     fprintf(stderr,"%s","  -D , --dump\t\t\t\t Dumps midi note ON/OFF commands\n");
  461.     fprintf(stderr,"%s","  -U , --no-gui\t\t\t\t Run ZynAddSubFX without user interface\n");
  462. #ifdef JACKAUDIOOUT
  463.     fprintf(stderr,"%s","  -A , --not-use-jack\t\t\t Use OSS/ALSA instead of JACK\n");
  464. #endif
  465. #ifdef OS_WINDOWS
  466.     fprintf(stderr,"%s","\nWARNING: On Windows systems, only short comandline parameters works.\n");
  467.     fprintf(stderr,"%s","  eg. instead '--buffer-size=512' use '-b 512'\n");
  468. #endif
  469.     fprintf(stderr,"%s","\n\n");
  470.     return(0);
  471.     };
  472.     
  473.     //---------
  474.     
  475.     initprogram();
  476.  
  477.     if (strlen(loadfile)>1){
  478.         int tmp=master->loadXML(loadfile);
  479.     if (tmp<0) {
  480.         fprintf(stderr,"ERROR:Could not load file  %s .\n",loadfile);
  481.         exit(1);
  482.     } else {
  483.         master->applyparameters();
  484.         if (noui==0) ui->refresh_master_ui();
  485.     };
  486.     };
  487.  
  488. #if !(defined(NONEMIDIIN)||defined(WINMIDIIN)||defined(VSTMIDIIN))
  489.     pthread_create(&thr1,NULL,thread1,NULL);
  490. #endif
  491.  
  492. #ifdef OSSAUDIOOUT
  493. //!(defined(JACKAUDIOOUT)||defined(JACK_RTAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT))
  494.     if (!usejackit) pthread_create(&thr2,NULL,thread2,NULL);
  495. #endif
  496.  
  497. /*It is not working and I don't know why
  498. //drop the suid-root permisions
  499. #if !(defined(JACKAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT)|| (defined (WINMIDIIN)) )
  500.       setuid(getuid());
  501.       seteuid(getuid());
  502. //      setreuid(getuid(),getuid());
  503. //      setregid(getuid(),getuid());
  504. #endif
  505. */
  506.     if (noui==0) pthread_create(&thr3,NULL,thread3,NULL);
  507.  
  508.     pthread_create(&thr4,NULL,thread4,NULL);
  509. #ifdef WINMIDIIN
  510.     InitWinMidi(master);
  511. #endif
  512.  
  513.     while (Pexitprogram==0){ 
  514. #ifdef OS_LINUX
  515.     usleep(100000);
  516. #elif OS_WINDOWS
  517.     Sleep(100);
  518. #endif
  519.     };    
  520.     
  521. #ifdef WINMIDIIN
  522.     StopWinMidi();
  523. #endif
  524.  
  525.     exitprogram();
  526.     return(0);
  527. };
  528.  
  529.  
  530. #else 
  531.  
  532. #include "Output/VSTaudiooutput.h"
  533.  
  534. #define main main_plugin
  535. extern "C" __declspec(dllexport) AEffect *main_plugin(audioMasterCallback audioMaster);
  536.  
  537. int instances=-1;
  538.  
  539. AEffect *main (audioMasterCallback audioMaster){
  540. //    if (audioMaster(0,audioMasterVersion,0,0,0,0)!=0) {
  541. //    return(0);
  542. //    };
  543.  
  544.     if (instances==-1){
  545.     Midi=new NULLMidiIn();
  546.     denormalkillbuf=new REALTYPE [SOUND_BUFFER_SIZE];
  547.     for (int i=0;i<SOUND_BUFFER_SIZE;i++) denormalkillbuf[i]=(RND-0.5)*1e-16;
  548.     instances=0;
  549.     };
  550.  
  551.     if (instances!=0) return(0);//don't allow multiple instances
  552.  
  553.     AudioEffect *sintetizator=new VSTSynth(audioMaster);
  554.  
  555.     return sintetizator->getAeffect();
  556. };
  557.  
  558. void* hInstance;
  559. BOOL WINAPI DllMain (HINSTANCE hInst,DWORD dwReason,LPVOID lpvReserved){
  560.     hInstance=hInst;
  561.     return(1);
  562. };
  563.  
  564. void *thread(void *arg){
  565.     VSTSynth *vs=(VSTSynth *) arg;
  566.  
  567. /*    FILE *a=fopen("aaaa1","a");
  568.     fprintf(a,"%lx %lx %lx -i=%d\n",vs,0,vs->vmaster,instances);
  569.     fflush(a);fclose(a);
  570. */
  571.  
  572.     vs->ui=new MasterUI(vs->vmaster,&vs->Pexitprogram);
  573.  
  574. /*    a=fopen("aaaa1","a");
  575.     fprintf(a,"%lx %lx %lx\n",vs,vs->ui->master,vs->vmaster);
  576.     fflush(a);fclose(a);
  577. */
  578.  
  579.     vs->ui->showUI();
  580.  
  581. /*    a=fopen("aaaa1","a");
  582.     fprintf(a,"%lx %lx %lx\n",vs,vs->ui,vs->vmaster);
  583.     fflush(a);fclose(a);
  584. */
  585.  
  586.     while (vs->Pexitprogram==0) Fl::wait(0.01);
  587.  
  588.     delete(vs->ui);
  589.     Fl::wait(0.01);
  590.  
  591. /*    a=fopen("aaaa1","a");
  592.     fprintf(a,"EXIT\n");
  593.     fflush(a);fclose(a);
  594. */
  595.  
  596.     
  597.     pthread_exit(0);
  598.     return(0);
  599. };
  600.  
  601. //Parts of the VSTSynth class
  602. VSTSynth::VSTSynth (audioMasterCallback audioMaster):AudioEffectX(audioMaster,1,0){
  603.     instances++;
  604.  
  605.   if (audioMaster){
  606.     setNumInputs(0);
  607.     setNumOutputs(2);
  608.     setUniqueID('ZASF');
  609.     canProcessReplacing();
  610. //    hasVu(false);
  611. //    hasClip(false);
  612.  
  613.     isSynth(true);
  614.  
  615.     programsAreChunks(true);
  616.     
  617.   };
  618.  
  619.  
  620.     SAMPLE_RATE=config.cfg.SampleRate;    
  621.     SOUND_BUFFER_SIZE=config.cfg.SoundBufferSize;
  622.     OSCIL_SIZE=config.cfg.OscilSize;
  623.     swaplr=config.cfg.SwapStereo;
  624.     this->Pexitprogram=0;
  625.     
  626.     this->vmaster=new Master();
  627.     this->vmaster->swaplr=swaplr;
  628.     
  629.  
  630. //    FILE *a=fopen("aaaa0","a");
  631. //    fprintf(a,"%lx %lx %lx\n",this,this->ui,this->ui->masterwindow);
  632. //    fflush(a);fclose(a);
  633.  
  634.     pthread_create(&this->thr,NULL,thread,this);
  635.  
  636. //    suspend();
  637.  
  638. };
  639.  
  640.  
  641.  
  642. VSTSynth::~VSTSynth(){
  643.     this->Pexitprogram=1;
  644.     
  645.     Sleep(200);//wait the thread to finish
  646.     
  647. //    pthread_mutex_lock(&vmaster->mutex);
  648.  
  649.  
  650.     delete(this->vmaster); 
  651.  
  652.     instances--;
  653. };
  654.  
  655. long VSTSynth::processEvents(VstEvents *events){
  656.     for (int i=0;i<events->numEvents;i++){
  657.  
  658.       //debug stuff
  659. //      FILE *a=fopen("events","a");
  660. //      fprintf(a,"%lx\n",events->events[i]->type);
  661. //      fflush(a);fclose(a);
  662.  
  663.     if ((events->events[i])->type != kVstMidiType) continue;
  664.     VstMidiEvent *ev= (VstMidiEvent*) events->events[i];
  665.     unsigned char *data= (unsigned char *)ev->midiData;
  666.     int status=data[0]/16;
  667.     int cmdchan=data[0]&0x0f;
  668.     int cntl;    
  669.  
  670.     pthread_mutex_lock(&vmaster->mutex);
  671.     switch(status){
  672.         case 0x8:vmaster->NoteOff(cmdchan,data[1]&0x7f);
  673.          break;
  674.         case 0x9:if (data[2]==0) vmaster->NoteOff(cmdchan,data[1]&0x7f);
  675.               else vmaster->NoteOn(cmdchan,data[1]&0x7f,data[2]&0x7f);
  676.          break;
  677.         case 0xB: cntl=Midi->getcontroller(data[1]&0x7f);
  678.               vmaster->SetController(cmdchan,cntl,data[2]&0x7f);
  679.          break;
  680.         case 0xE: vmaster->SetController(cmdchan,C_pitchwheel,data[1]+data[2]*(long int) 128-8192);
  681.          break;
  682.     };
  683.     pthread_mutex_unlock(&vmaster->mutex);
  684.     
  685.     };
  686.  
  687. return(1);
  688. };
  689.  
  690. long VSTSynth::getChunk(void** data,bool isPreset){
  691.     int size=0;
  692.     size=vmaster->getalldata((char **)data);
  693.     return((long)size);
  694. };
  695.  
  696. long VSTSynth::setChunk(void *data,long size,bool isPreset){
  697.     vmaster->putalldata((char*)data,size);
  698.     return(0);
  699. };
  700. #endif
  701.  
  702.